package 每日一题;

/**
 * @description:
 * @author: 小白白
 * @create: 2021-10-01
 **/

public class No223矩形面积 {

    /**
     * 给你 二维 平面上两个 由直线构成的 矩形，请你计算并返回两个矩形覆盖的总面积。
     * 每个矩形由其 左下 顶点和 右上 顶点坐标表示：
     * 第一个矩形由其左下顶点 (ax1, ay1) 和右上顶点 (ax2, ay2) 定义。
     * 第二个矩形由其左下顶点 (bx1, by1) 和右上顶点 (bx2, by2) 定义。
     *  
     * 示例 1：
     * 输入：ax1 = -3, ay1 = 0, ax2 = 3, ay2 = 4, bx1 = 0, by1 = -1, bx2 = 9, by2 = 2
     * 输出：45
     * 示例 2：
     * 输入：ax1 = -2, ay1 = -2, ax2 = 2, ay2 = 2, bx1 = -2, by1 = -2, bx2 = 2, by2 = 2
     * 输出：16
     *  
     * 提示：
     * -104 <= ax1, ay1, ax2, ay2, bx1, by1, bx2, by2 <= 104
     */

    // 更好的解法,求x/y方向相交的长度
    public int computeAreaGood(int ax1, int ay1, int ax2, int ay2,
                               int bx1, int by1, int bx2, int by2) {

        int x = Math.max(0, Math.min(ax2, bx2) - Math.max(ax1, bx1));
        int y = Math.max(0, Math.min(ay2, by2) - Math.max(ay1, by1));

        // A面积
        int A = Math.abs(ax1 - ax2) * Math.abs(ay1 - ay2);
        // B面积
        int B = Math.abs(bx1 - bx2) * Math.abs(by1 - by2);

        return A + B - x * y;
    }

    public int computeArea(int ax1, int ay1, int ax2, int ay2,
                           int bx1, int by1, int bx2, int by2) {

        // 左边是小的,才能顾全重叠情况
        if (bx2 <= ax1) {
            return this.computeArea(bx1, by1, bx2, by2, ax1, ay1, ax2, ay2);
        }

        // 公共面积 = A面积 + B面积 - 重叠的面积

        // A面积
        int A = Math.abs(ax1 - ax2) * Math.abs(ay1 - ay2);
        // B面积
        int B = Math.abs(bx1 - bx2) * Math.abs(by1 - by2);

        // 注意没有重叠的情况
        // 是否有任意一个角在别人领域内
        if (ay2 <= by1 || ax2 <= bx1 || ay1 >= by2) {
            return A + B;
        }

        // 重叠面积
        // x投影,一个最大和一个最小即可
        int top = Math.min(ay2, by2);
        int left = Math.max(ax1, bx1);
        int right = Math.min(ax2, bx2);
        int bottom = Math.max(ay1, by1);

        return (A + B) - (right - left) * (top - bottom);
    }

    public static void main(String[] args) {
        No223矩形面积 n = new No223矩形面积();
        int result = n.computeAreaGood(-2, -2, 2, 2, 3, 3, 4, 4);
        System.out.println(result);
    }

}
